package edu.upc.wib.dao.impl;

import edu.upc.wib.dao.ReporteDao;
import edu.upc.wib.entity.Contendor;
import edu.upc.wib.entity.Participante;
import edu.upc.wib.entity.ReporteEfectividad;
import edu.upc.wib.entity.ReporteTorneo;
import edu.upc.wib.entity.Torneo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author Joan
 */
@Repository
public class ReporteDaoImpl extends SimpleJdbcDaoSupport implements ReporteDao {

    private static Logger log = LoggerFactory.getLogger(ReporteDaoImpl.class);

    @Autowired
    public ReporteDaoImpl(DataSource dataSource) {
        log.info("Asignando el dataSource");
        setDataSource(dataSource);
    }
    
    @Override
    public List<ReporteEfectividad> generarReporteEfectividad(Integer idUsuario) {
//        return getSimpleJdbcTemplate().query(
//                "select a.idTorneo, nombre, "
//                + "numParticipantes, "
//                + "(select count(distinct idParticipante) from favorito c where c.idTorneo = a.idTorneo) as cantReal, "
//                + "(select count(distinct idParticipante) from favorito c where c.idTorneo = a.idTorneo)/numParticipantes as porcEfectividad, "
//                + "fechaFin - fechaInicio as tiempoDefinido, "
//                + "b.descripcion as estado "
//                + "from torneo a, estado b , usuario_torneo c "
//                + "where "
//                + "a.idEstado = b.idEstado and c.idTorneo = a.idTorneo "
//                + "and c.idUsuario = ? "
//                + "order by porcEfectividad desc",
//                new BeanPropertyRowMapper<ReporteEfectividad>(ReporteEfectividad.class), idUsuario);

        return getSimpleJdbcTemplate().query(
            "select a.idTorneo, nombre, "
            + "numParticipantes, "
            + "cantRealParticipantes, "
            + "cantRealParticipantes/numParticipantes as porcEfectividad, "
            + "fechaFin - fechaInicio as tiempoDefinido, "
            + "b.descripcion as estado "
            + "from torneo a, estado b , usuario_torneo c "
            + "where "
            + "a.idEstado = b.idEstado and c.idTorneo = a.idTorneo "
            + "and c.idUsuario = ? "
            + "order by porcEfectividad desc",
            new BeanPropertyRowMapper<ReporteEfectividad>(ReporteEfectividad.class), idUsuario);
    }

    @Override
    public List<ReporteTorneo> generarReporteTorneo(Integer idTorneo, Integer idUsuario) {
        String sql = 
                "select f.idTorneo,"
                     + "t.nombre as nombreTorneo, "
                     + "t.cantRealParticipantes, "
                     + "t.numContendores, "
                     + "t.fechaInicio, "
                     + "t.fechaFin, "
                     + "t.flgModoGrafico, "
                     + "p.idParticipante, "
                     + "p.correo, "
                     + "p.nombre, "
                     + "c1.idContendor as idContendor1, "
                     + "c1.nombre as nombreContendor1, "
                     + "c1.texto as textoContendor1, "
                     + "c1.rutaImagen as rutaImagenContendor1, "
                     + "c1.agrupadorInicial as agrupadorInicialContendor1, "
                     + "c2.idContendor as idContendor2, "
                     + "c2.nombre as nombreContendor2, "
                     + "c2.texto as textoContendor2, "
                     + "c2.rutaImagen as rutaImagenContendor2, "
                     + "c2.agrupadorInicial as agrupadorInicialContendor2, "
                     + "f.ganador, "
                     + "f.posFixture "
              + "from favorito f "
                + "inner join torneo t on t.idTorneo = f.idTorneo "
                + "inner join usuario_torneo u on u.idTorneo = t.idTorneo "
                + "inner join participante p on p.idParticipante = f.idParticipante "
                + "inner join contendor c1 on c1.idContendor = f.contendor1 "
                    + "and c1.idtorneo = t.idTorneo "
                + "inner join contendor c2 on c2.idContendor = f.contendor2 "
                    + "and c2.idtorneo = t.idTorneo "
              + "where     f.idTorneo = " + idTorneo + " "
                    + "and u.idUsuario = " + idUsuario + " "
              + "order by f.posFixture asc, c1.agrupadorinicial asc, f.idparticipante asc;";
        
        
        List<ReporteTorneo> lst = new ArrayList<ReporteTorneo>();
        List<Map<String, Object>> rows = getJdbcTemplate().queryForList(sql);
        
        for (Map row : rows) {
            ReporteTorneo rpt = new ReporteTorneo();
            
            Torneo torneo = new Torneo();
            torneo.setNombre((String)row.get("nombreTorneo"));
            torneo.setNumParticipantes((Integer)row.get("cantRealParticipantes"));
            torneo.setNumContendores((Integer)row.get("numContendores"));
            torneo.setFechaInicio((Date)row.get("fechaInicio"));
            torneo.setFechaFin((Date)row.get("fechaFin"));
            torneo.setFlgModoGrafico((Boolean)row.get("flgModoGrafico"));
            
            rpt.setTorneo(torneo);
            
            Participante participante = new Participante();
            participante.setIdParticipante((Integer)row.get("idParticipante"));
            participante.setNombre((String)row.get("nombre"));
            participante.setCorreo((String)row.get("correo"));
            
            rpt.setTorneo(torneo);
            
            Integer idContendor1 = (Integer)row.get("idContendor1");
            Contendor contendor1 = new Contendor
            (
                idTorneo, 
                idContendor1, 
                (String)row.get("nombreContendor1"), 
                (String)row.get("textoContendor1"), 
                (String)row.get("rutaImagenContendor1"),
                (Integer)row.get("agrupadorInicialContendor1")
            );
            rpt.setContendor1(contendor1);
            
            Integer idContendor2 = (Integer)row.get("idContendor2");
            Contendor contendor2 = new Contendor
            (
                idTorneo, 
                idContendor2, 
                (String)row.get("nombreContendor2"), 
                (String)row.get("textoContendor2"), 
                (String)row.get("rutaImagenContendor2"),
                (Integer)row.get("agrupadorInicialContendor2")
            );
            
            rpt.setContendor2(contendor2);
            
            Integer ganador = (Integer)row.get("ganador");
            rpt.setGanador(idContendor1 == ganador ? contendor1 : contendor2);
                
            rpt.setPosFixture((Integer)row.get("posFixture"));
            
            lst.add(rpt);
	}
        
        return lst;
    }
}